package cn.net.Annotation;

import javax.xml.bind.Element;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;

public class TestAnnotation {

}
/*1.2 通过【@Target元注解】表示此【自定义注解可以使用的位置】
* 注意:@Target（）注解使用时需要导包,通过{ElementType.静态常量值}的方式来指定*/
@Target({ElementType.METHOD,ElementType.TYPE, ElementType.FIELD})//表示此注解可以加在方法上/类上/成员变量/字段上
/*1.3通过【@Retention注解】表示【自定义注解的生命周期】*/
@Retention(RetentionPolicy.SOURCE)//SOURCE源文件中/CLASS字节码文件中/RUNTIME运行时有效;这三个值只能3选1,不能同时写多个
        /*1.1自定义注解格式：@interface 注解名"的方式来定义*/
@interface Test{
    //第二种：可以给自定义注解属性， 必须指定默认值为default 0   ； 选其一
    int age() default 0;//不可以简写
    /*4.注解中还可以【添加功能-定义特殊属性value】
     * 【特殊属性的定义方式与别的属性相同】主要是【使用方式不同】
     * 使用此注解给属性赋值的时候,可以不用写成"@Test(value = "Apple")"
     * 格式可以简化"@Test("Apple")"直接写值
     * 如果自定义了默认值,可以不用赋值,直接使用@Test注解*/
    String value() default "apple";//不可以简写
}

//2.定义一个类用来【测试自定义注解】
@Test
class TestAnno{
        @Test
    /*测试1:分别给TestAnno类/name属性/eat()都添加了@Test注解,只有方法上不报错
     * 结论:自定义注解能够加在什么位置,取决于@Target注解的值
     * 测试2:修改@Target注解的值:@Target({ElementType.METHOD,ElementType.TYPE,ElementType.FIELD})
     * 结论:注解@Test可以存在多个位置,如果@Target有多个值,格式是"{ , }"
     * 原因:Target注解的源码:'ElementType[] value();*/
        String name;
        int age;
        //第一种赋值：选其一
        //@Test(age = 18)
        //@Test(value = "apple")
        public void eat(){
            System.out.println("又到干饭时间啦~");
        }

}